Les protocoles de transport

Sommaire :

Le protocole TCP
Le protocole UDP

 

Le protocole TCP

Généralités - Segmentation et séquencement des données - Mécanisme d'acquittement - Etablissement d'une connexion - Contrôle du flux de données - Structure des segments TCP - Numéros de ports usuels

 

Généralités

TCP est un protocole de la couche Transport au sens du modèle OSI. Il s'exécute au dessus du protocole IP qui lui fournit un service de datagrammes sans connexion entre deux machines. TCP est un protocole orienté connexion qui garantit que les données sont remises de façon fiable. TCP s'oppose à UDP qui est moins robuste mais plus efficace dans certaines situations.

Le protocole IP est sans connexion et ne garantit absolument pas que le datagramme envoyé a été remis, TCP s'appuie donc sur l'hypothèse que IP n'est pas fiable et qu'il faut au niveau Transport mettre en place un certain nombre de contrôle.

Les fonctionnalités de TCP sont donc principalement :

 

Segmentation et séquencement des données

Lorsque de l'information doit être envoyée d'un émetteur vers un récepteur par le protocole TCP, cette information est découpée en segments qui peuvent être de taille variable. Mais pour des raisons de fiabilité chaque octet d'un segment va être numéroté avec un numéro de séquence.

Lors de l'envoi de l'information, dans l'entête de chaque segment, seul le n° de séquence du premier octet sera mentionné. Les autres numéros (en fait c'est le numéro du dernier qui est intéressant) seront calculés en ajoutant ce numéro au nombre d'octets présents dans la partie "données" du segment.

Ce numéro de segment est codé sur 32 bits ce qui permet de numéroter les segments jusqu'à la valeur 2 32 = 4 294 967 296, au delà il faudra repartir à partir de la valeur 0.

 

Mécanisme d'acquittement

La transmission doit être fiable, TCP utilise donc le mécanisme classique d'acquittement mais dans une version dite cumulative.

Le principe de l'acquittement

Le principe général est assez simple : Lorsqu'un segment est reçu par le destinataire, celui-ci vérifie que les données contenues dans ce segment sont correctes (consultation du checksum) et si c'est le cas envoie un message d'acquittement positif (ACK) vers l'expéditeur.

Deux types de problèmes peuvent se produire :

Pour détecter ce type de problème, chaque fois qu'il envoie un segment l'expéditeur effectue 2 opérations :

Si au bout d'un certain délai aucun acquittement positif n'a été reçu du destinataire le segment est renvoyé en utilisant la copie présente dans le buffer, si par contre un acquittement est reçu pour ce segment, la copie est supprimée du buffer.

L'acquittement cumulatif

Le protocole TCP utilise le principe de l'acquittement cumulatif, c'est à dire que comme les données sont envoyées par segments de taille variable mais comportant le n° de séquence du premier octet du segment (cf paragraphe sur la segmentation et le séquencement des données), si le contrôle du checksum est satisfaisant, le récepteur déduit à partir du n° de séquence du premier octet et du nombre d'octets reçus le n° de séquence du dernier octet et accuse réception pour cet octet, ce qui implique de façon implicite que tous les octets dont le n° de séquence est inférieur à ce n° de séquence ont été bien reçus.

Il se peut même que pour des raisons d'optimisation, le récepteur attende la réception de plusieurs segments avant d'envoyer un acquittement, ceci a pour but de diminuer le nombre de segments d'acquittements circulant sur le réseau.

Cette technique d'acquittement cumulé a pour principal avantage d'éviter la retransmission de données si un paquet d'acquittement s'est perdu.

 

Etablissement d'une connexion

TCP est un protocole orienté connexion, cela signifie qu'il va établir et maintenir une connexion entre deux machines et surveiller l'état de cette connexion pendant toute la durée du transfert. Pour établir une connexion, il faut évidemment identifier les extrémités (end points) de cette connexion, cela se fait avec le couple (n° IP, n° de port). Le n° IP est celui de l'interface réseau par laquelle les données vont transiter, le n° de port est un numéro associé à l'application.

Exemple de connexion : (192.14.56.17,1400) <-> (192.14.56.26,21)
Cette connexion est établie entre les 2 machines 192.14.56.17 et 192.14.56.26 en utilisant respectivement les ports 1400 et 21.

TCP fonctionne en full duplex, c'est à dire que lorsqu'une connexion est éblie les données vont pouvoir transiter simultanément dans un sens et dans l'autre.

La demande de connexion peut s'effectuer de 2 manières :

L'initialisation d'une connexion se fait toujours par ce qui s'appelle une "Poignée de main à 3 voies" qui est la traduction litéralle de "Three Way Handshake", cette intialisation se déroule donc en 3 étapes. Ces 3 étapes ont pour but essentiel de synchroniser les numéros de séquence des 2 machines :

De cette façon chaque machine connaît le n° de séquence de l'autre et l'échange d'information peut débuter.

Contrôle du flux de données

Les machines qui émettent et qui reçoivent des données sont sans doute différentes, elles ne sont sans doute pas en mesure de travailler au même rythme. Il se peut donc que l'émetteur envoie ses données trop rapidement par rapport à la vitesse à laquelle le récepteur peut les traiter. En fait le récepteur stocke les données reçues dans un buffer et c'est la place encore libre dans ce buffer qui détermine la quantité de données que cette machine peut encore recevoir.

C'est pour cette raison que le protocole TCP prévoit un mécanisme de contrôle de flux de données basé sur la technique dite de la "fenêtre glissante". Le principe est le suivant : A chaque acquittement, le récepteur renvoie une valeur (taille de la fenêtre) qui correspond au nombre d'octets que l'émetteur peut envoyer avant le prochain retour d'acquittement. La taille de la fenêtre est fixée par le récepteur à chaque émission d'acquittement.

Exemple :

Dans cet exemple la fenêtre est de largeur 8. Les octets 1 à 3 ont été envoyés et acquittés, par contre les octets 4 à 8 non pas encore été acquittés il reste donc une incertitude sur leur bonne réception par le récepteur, comme la taille de la fenêtre est de 8, l'émetteur peut encore émettre sans attendre d'acquittement les octets 9 à 11 mais pas au delà.

Supposons qu'à cet instant l'émetteur reçoit un acquittement pour les octets 4 à 6 et une taille de fenêtre de 10, on obtient alors la situation suivante :

Lorsque le récepteur est trop sollicité et qu'il voit l'espace libre dans son buffer diminuer, il va avoir tendance à réduire la taille de la fenêtre jusqu'à éventuellement atteindre 0 ce qui signifie que le récepteur n'est plus apte pour l'instant à recevoir des données. Il y un cas très embêtant c'est le cas où le destinataire impose une taille de fenêtre de 1, c'est que l'on appelle le syndrome de la fenêtre stupide (SWS pour Silly Window Syndrom).

Exercice : Imaginer quelles peuvent être les conséquences du "syndrome de la fenêtre stupide". Proposer des solutions pour y remédier.

 

Structure des segments TCP

Le segment TCP c'est l'unité de transfert du protocole TCP, il est utilisé indifféremment pour établir les connexions, transférer les données, émettre des acquittements, fermer les connexions.

De façon classique, la structure d'un segment TCP comprend un entête de taille variable qui utilise un format en mot de 32 bits suivi d'un zone de données.


Cliquer sur une zone pour obtenir le descriptif du champ.

Source Port et Destination Port (2 x 16 bits)

Ces deux champs de 16 bits chacun contiennent les numéros de port de la source et de la destination. Certains numéros de ports sont dédiés à un protocole particulier (par exemple le port 80 est dédié à http).

Retour au descriptif du segment TCP

Sequence Number (32 bits)

Ce n° sur 32 bits correspond au numéro de séquence du premier octet de données de ce segment de données, en effet le protocole TCP numérote chaque octet envoyé. Si le drapeau SYN vaut 1, ce champ définit le numéro de séquence initial (ISN).

Retour au descriptif du segment TCP

Acknowledgment Number (32 bits)

Ce champ sert lorsque le segment est un segment d'acquittement (le drapeau ACK du champ Flags est à 1), il indique le numéro de séquence du prochain octet attendu (c'est à dire le n° de séquence du dernier octet reçu + 1), tous les octets précédents cumulés sont implicitement acquittés.

Retour au descriptif du segment TCP

Offset (4 bits)

Le champ Options ayant une largeur variable, ce champ donne la taille en mots de 32 bits de l'entête du segment. Si le champ Options est vide, cette taille est égale à 5 (entête de 20 octets).

Retour au descriptif du segment TCP

Flags (6 bits)

Ce champ comprend 6 drapeaux :

Retour au descriptif du segment TCP

Window (16 bits)

Taille de la fenêtre, c'est à dire le nombre d'octets que le récepteur est en mesure d'accepter à partir du numéro d'acquittement.. Voir le paragraphe sur le contrôle de flux.

Retour au descriptif du segment TCP

Checksum (16 bits)

Le Checksum est constitué en calculant le complément à 1 sur 16 bits de la somme des compléments à 1 des octets de l'en-tête et des données pris deux par deux (mots de 16 bits). Si le message entier contient un nombre impair d'octets, un 0 est ajouté à la fin du message pour terminer le calcul du Checksum. Cet octet supplémentaire n'est pas transmis. Lors du calcul du Checksum, les positions des bits attribués à celui-ci sont marqués à 0.

Le Checksum couvre de plus une pseudo en-tête de 96 bits préfixée à l'en-tête TCP. Cette pseudo en-tête comporte les adresses Internet source et destinataires, le type de protocole et la longueur du message TCP. Ceci protège TCP contre les erreurs de routage. Cette information sera véhiculée par IP, et est donnée comme argument par l'interface TCP/Réseau lors des appels d'IP par TCP.

La longueur TCP compte le nombre d'octets de l'en-tête TCP et des données du message, en excluant les 12 octets de la pseudo en-tête.

Retour au descriptif du segment TCP

Urgent Pointer (16 bits)

Donne la position d'une donnée urgente en donnant son décalage par rapport au numéro de séquence. Ce champ n'est utilisé que si le drapeau URG est positionné. Les données urgentes devront passer devant la file d'attente du récepteur, c'est par exemple avec ce mécanisme qu'il est possible d'envoyer des commandes d'interruption au programme Telnet.

Retour au descriptif du segment TCP

Options (variable)

Les options sont utilisées pour des fonctions de test.

Retour au descriptif du segment TCP

Padding (variable)

Octets de bourrage qui permettent de terminer l'en-tête TCP.

Retour au descriptif du segment TCP

 

Numéros de port usuels

No port
Mot-clé
Description
20 FTP-DATA File Transfer [Default Data]
21 FTP File Transfer [Control]
23 TELNET Telnet
25 SMTP Simple Mail Transfer
37 TIME Time
42 NAMESERVER Host Name Server
43 NICNAME Who Is
53 DOMAIN Domain Name Server
79 FINGER Finger
80 HTTP WWW
110 POP3 Post Office Protocol - Version 3
111 SUNRPC SUN Remote Procedure Call


 

Le protocole UDP

Généralités - Structure du paquet UDP

Généralités

Le protocole UDP est une alternative au protocole TCP. Comme TCP, il intervient au dessus de la couche IP, au niveau Transport au sens des couches ISO.

Les caractéristiques du protocole UDP sont les suivantes :

UDP est donc un protocole orienté commande/réponse où ces UDP est également utile pour les applications qui nécessitent une diffusion d'informations car dans ce cas il serait pénalisant d'utiliser un protocole comme TCP orienté connexion qui devrait gérer (ouvrir et fermer) autant de connexion que de noeuds auxquels l'information est destinée.

UDP est utilisé par les applications TFTP (Trivial File Transfer Protocol), DNS (Domain Name System), NFS (Network File System), SNMP (Simple Network Management Protocol), RIP (Routing Information Protocol) ainsi que de nombreux services qui envoient des données en diffusion comme WHOD (Who Daemon pour serveurs Unix) par exemple.

 

Structure du paquet UDP

  • Source Port et Destination Port : port source et destination
  • Length : Longueur du paquet UDP
  • Checksum : champ de contrôle des données dans lequel on trouve un pseudo entête dans lequel figurent les adresses IP source et destination, le code du protocole (UDP = 17) et la longueur, ceci pour prévenir les possibles erreurs de routage.